SQL s klauzulou MAX
Otázka od: Peter Vlkovic
31. 10. 2002 15:19
Ahoj,
riesim problem selectu s klauzulou MAX.
Mam dve tabulky. Tabulku osoba a archiv.
Tabulka archiv obsahuje k jednej osobe
spravidla viacero zaznamov, mna vsak
zaujima zaznam s poslednym datumom.
Nasledovny select funguje spravne:
select
osoba.MENO,
osoba.PRIEZ,
( select max(DATUM) from archiv where ID=osoba.ID )
...
Z tabulky archiv vsak potrebujem okrem hodnoty
DATUM aj inu polozku (napr. OPERATOR), co sa mi
vsak nedari, hoci som uz skusal vsetko mozne,
co ma napadlo (napr. rozne konstrukcie LEFT JOIN-u).
Nevedel by mi niekto pomoct? Ide o databazu INFORMIX.
Vlkovic
Odpovedá: tomsir1.edu@mail.cez.cz
31. 10. 2002 14:36
... a co pouzit SELECT max(DATUM) as max_datum, OPERATOR FROM archiv
WHERE ....
Radek
Peter Vlkovic <vlkovic@minv.sk>@clexpert.cz on 31.10.2002 14:08:35
Odpovězte prosím - delphi-l@clexpert.cz
Odesláno kým: delphi-l-owner@clexpert.cz
Komu: delphi-l@clexpert.cz
Kopie:
Předmět: SQL s klauzulou MAX
Ahoj,
riesim problem selectu s klauzulou MAX.
Mam dve tabulky. Tabulku osoba a archiv.
Tabulka archiv obsahuje k jednej osobe
spravidla viacero zaznamov, mna vsak
zaujima zaznam s poslednym datumom.
Nasledovny select funguje spravne:
select
osoba.MENO,
osoba.PRIEZ,
( select max(DATUM) from archiv where ID=osoba.ID )
...
Z tabulky archiv vsak potrebujem okrem hodnoty
DATUM aj inu polozku (napr. OPERATOR), co sa mi
vsak nedari, hoci som uz skusal vsetko mozne,
co ma napadlo (napr. rozne konstrukcie LEFT JOIN-u).
Nevedel by mi niekto pomoct? Ide o databazu INFORMIX.
Vlkovic
Odpovedá: Lstiburek Pavel
31. 10. 2002 15:51
napr. takto:
SELECT Osoba.*, xArchiv.*
FROM Osoba LEFT OUTER JOIN (
SELECT ID, Datum, OPERATOR, ...
FROM archiv
WHERE Datum = (SELECT Max( Datum)
FROM Archiv arch
WHERE arch.ID = archiv.Id)
) xArchiv ON Osoba.ID = xArchiv.ID
Podminkou je, ze datum v tabulce archiv je pro osobu jejinecne !
Pavel
> Od: Peter Vlkovic [mailto:vlkovic@minv.sk]
> riesim problem selectu s klauzulou MAX.
> Mam dve tabulky. Tabulku osoba a archiv.
> Tabulka archiv obsahuje k jednej osobe
> spravidla viacero zaznamov, mna vsak
> zaujima zaznam s poslednym datumom.
> Nasledovny select funguje spravne:
>
> select
> osoba.MENO,
> osoba.PRIEZ,
> ( select max(DATUM) from archiv where ID=osoba.ID )
> ...
>
> Z tabulky archiv vsak potrebujem okrem hodnoty
> DATUM aj inu polozku (napr. OPERATOR), co sa mi
> vsak nedari, hoci som uz skusal vsetko mozne,
> co ma napadlo (napr. rozne konstrukcie LEFT JOIN-u).
>
> Nevedel by mi niekto pomoct? Ide o databazu INFORMIX.
Odpovedá: Peter Vlkovic
31. 10. 2002 17:12
> ... a co pouzit SELECT max(DATUM) as max_datum, OPERATOR FROM archiv
> WHERE ....
> Radek
Vysledok vnoreneho selectu nemoze byt viac nez jeden stlpec.
Takze i nadalej ostavam v koncoch.
Vlkovic
> Mam dve tabulky. Tabulku osoba a archiv.
> Tabulka archiv obsahuje k jednej osobe
> spravidla viacero zaznamov, mna vsak
> zaujima zaznam s poslednym datumom.
> Nasledovny select funguje spravne:
>
> select
> osoba.MENO,
> osoba.PRIEZ,
> ( select max(DATUM) from archiv where archiv.ID=osoba.ID )
> ...
>
> Z tabulky archiv vsak potrebujem okrem hodnoty
> DATUM aj inu polozku (napr. OPERATOR)...
Odpovedá: Peter Vlkovic
31. 10. 2002 18:06
> napr. takto:
>
> SELECT Osoba.*, xArchiv.*
> FROM Osoba LEFT OUTER JOIN (
> SELECT ID, Datum, OPERATOR, ...
> FROM archiv
> WHERE Datum = (SELECT Max( Datum)
> FROM Archiv arch
> WHERE arch.ID = archiv.Id)
> ) xArchiv ON Osoba.ID = xArchiv.ID
>
> Podminkou je, ze datum v tabulce archiv je pro osobu jejinecne !
>
> Pavel
Tvoj select je naozaj prespekulovany. Lenze Informix mi
takyto zapis nechce zozrat. Vyhadzuje syntakticku chybu
v druhom selecte (vo fraze join).
[Nehovoriac o tom, ze v ramci tabulky archiv moze rovnakych
datumov existovat viacero].
Ale aj tak - vdaka za snahu.
Vlkovic
> > Mam dve tabulky. Tabulku osoba a archiv.
> > Tabulka archiv obsahuje k jednej osobe
> > spravidla viacero zaznamov, mna vsak
> > zaujima zaznam s poslednym datumom.
> > Nasledovny select funguje spravne:
> >
> > select
> > osoba.MENO,
> > osoba.PRIEZ,
> > ( select max(DATUM) from archiv where ID=osoba.ID )
> > ...
> >
> > Z tabulky archiv vsak potrebujem okrem hodnoty
> > DATUM aj inu polozku (napr. OPERATOR)...
Odpovedá: Lstiburek Pavel
1. 11. 2002 8:36
Abych jen tak nepovidal, zde je priklad:
----------------------------------------
select
osoba.*,
( select max(DATUM) from archiv where ID=osoba.ID ) Datum,
( select TOP 1 Operator FROM archiv
where ID = osoba.Id
order by Datum desc) Operator
FROM OSOBA
Upozornuji pouze, ze pokud datum neni v tabulce archiv pro ID jedinecne, tak
to co ziskas je neco podobneho spatnemu generatoru nahodnych cisel. V SQL
serverech neplati, ze pri trideni zaznamu se jako pomocny klic pouziva jeste
poradi zaznamu v tabulce (jako ve flat databazich napr. DBASE, Paradox,
...)!
Aplikaci by asi prospelo trochu analyzy, nejjednodusi by bylo (i kdyz ne moc
analyticke), doplnit do tabulky dalsi sloupec typu IDENTITY a ten pouzit
jako druhy klic pro trideni : " order by datum, PORADIVZNIKU "
>
> [Nehovoriac o tom, ze v ramci tabulky archiv moze rovnakych
> datumov existovat viacero].
>